# print("Runoobm")
# 第一个注释
# print("Hello Word!") #第二个注释

# 多个注释可以用多个#，或者''',"""

'''
第三个注释
'''

"""
第四个注释
"""

# print("Hello Python!")

# if True:
#     print("Hello Python!")
# else:
#     print("Error")

# if True:
#     print("A true")
#     print("True")
# else:
#     print("A False")
#     print("False")


# a = 1
# print(a)
# print("this is a new!")
# print(r"this is onther new! \n and onther!")
# print("加号的" + "连接作用") #字符串可以用加号连接在一起
from calendar import c
from multiprocessing.sharedctypes import Value
from tkinter.tix import Tree


word = '字符串'
words = "也是字符串"
wordss = '''我是一个
多行的
字符串'''
print(word,words,wordss)


# 输出字符串
# str = '123456789'

# print(str[1:5]) #输出字符串从第二位到第五位
# print(str[0:-1]) # 输出第一个到倒数第二个所有字符
# print(str[1:5:2])# 输出从第二个开始到第五个且每隔一个的字符（步长为2)
# print(str * 2) # *代表重复，输出两次字符串

# input("\n\n按下 回车键 后退出")

# import sys; x = 'student'; sys.stdout.write( x + '\n') # 一行可以使用多条语句，使用；分隔

# print输出，默认输出是换行的，如果不想换行，末尾加end = ""
# x = '1'
# y = '2'
# print(x);print(y)
# print( x ,end="")
# print('\n',y,end='')

# 导入sys模块
# import sys
# print('=======Python import mode =======')
# print('命令行参数为：')
# for i in sys.argv:
#     print(i)
# print('\n\npython路径为:',sys.path)

# 导入sys模块中的argv，path
# from sys import argv,path
# print('======Python from import=====')
# print('\npath',path) # 已经导入path成员，此处不需要加sys.path


# python3 基本数据类型
# a = 100 # 整型变量
# b = 1000.0 # 浮点型变量
# c = 'student' # 字符串

# print(a);print(b);print(c)

# 多变量复制
# a = b = c = 5 # 从后向前赋值
# print(a,b,c)

# # 多个对象指定多个变量
# a,b,c = 1,2,'student'
# print(a,b,c)

# python3中的6种数据类型(Number/String/List/Tuple/Set/Dictionary)

# 数据类型Number（int，float，bool，complex）
# a,b,c,d = 20, 5.5,True,2+4j
# print(type(a),type(b),type(c),type(d)) # 内置的type()函数可以查询变量所指的数据类型
a = 100
isinstance(a,int)

# bool是int的子类，True和False可以相加，True = 1 ，False  = 0；

a,b= 5/3, 5//3 # /返回一个浮点数，//返回一个整数
print(a,b)

word = 'student'
# word[1] = o # 与C字符串不同的是，Python字符串不能被改变，向一个索引位置复制，会导致错误
print(word[0],word[4])
print(word[-1],word[5])


# List是python中使用最频繁的数据类型

list = ['1234',789,5.6,True,'string']
mylist = ['98999',]

print('\n\n',list)
print(list[2])
print(list[1:-1])
print(list * 2) # 输出两次list
print(list + mylist) # 合并列表


# Python3字符串中的元素不可以更改，但是列表中的元素可以更改

list = [1,2,3,4,5,6]
list[1] = 9
print('\n',list[1])
list[2:5] = []
print(list)    # list中内置了很多方法，例如append()、pop()等

# list可以截取第三个参数，作用是截取步长
list1 = [1,3,4,5,6,7,8]
print('\n\n',list1[0:-1],'\n\n') # [0:-1],-1 是到倒数第二位元素
print(list1[0:4:2])
print('\n\n',list1[-1]) # [-1],-1 是指最后一位元素


# 如果第三个参数为负数表示逆向读取，以下为翻转字符实例
# def reverseWords(input):


##  元组（Tuple）

#tuple与列表类似，不同之处在于元组的元素不能修改
tuple = ('abcd',1234,5.6,2+4j)
mytuple = ('pol',89,7.9,4+5j)

print(tuple[0]) 
# tuple[0] = 9    # 非法行为，修改元组元素的操作是非法的
print(tuple)
print(tuple[0:3])
print(tuple[0:-1]) # 输出第一位至倒数第二位
print(tuple[-1]) # 最后一位
print(tuple * 2) # 输出两次元组
print(tuple + mytuple)
print(tuple[3] + mytuple[3])

# 特殊情况的元组语法规则
tuple = () # 空元组
mytuple = (20,) # 一个元素，需要在元素后面添加逗号
# 总结：String\List\Tuple 都属于sequence（序列）；注意：元组和字符串元素不能修改；


## Set（集合）
# 使用{}或者是set（）函数来创建集合；注：创建一个空集合必须使用set()而不是{}，因为{}是用来创建一个空字典
#创建格式
    # parame = {'Value01', 'value02'}
    # set(Value)

sites = {'Google', 'Taobao','Baidu','Facebook','Jindong'}
print(sites) #输出集合

if 'Google' in sites:
    print(True)
else:
    print(False)

# set()可以进行集合运算
a = set('Google')
b = set('Taobao')
print(a)            # 输出集合，重复的元素会被去掉 { 'G' , 'g' ,'o' ,'e', 'l' }
print(b)
print(a - b)        # a 和 b 的差集
print(a | b)        # a 和 b 的并集
print(a & b)        # a 和 b 的交集
print(a ^ b)        # a 和 b 中不同时存在的元素


# Dictionary（字典）

# dictionary是Python中另一个非常有用的内置数据类型；列表是有序对象集合，字典是无序对象的集合；
# 两者的区别在于：字典中的元素是通过键来存取的，而不是通过偏移存取
# 字典是一种映射类型，字典用{}标识，它是一个无序的键（key）：值（value）的集合；键必须使用不可变类型；在同一字典中，键必须是唯一的；
# 创建空字典用 {}

dict = {}
dict['one'] = "1 -  菜鸟教程"
dict[2] = "2 - 菜鸟工具"

mydict = {'name':'google', 'code':'200', 'site' : 'www.google.com'}
print(dict['one'])     # 输出键值为'one'的值
print(dict[2])
print('\n',mydict)     # 输出mydict的字典

print(mydict.keys())    # 输出所有的键
print(mydict.values(),'\n')  # 输出所有的值



### 总结：
# 01. 基本数据类型：Number、String、List、Tuple(元组)、Set(集合)、Dictionary(字典)
# 02. 不可变数据：Number、string、tuple（通过下表获取到元素之后，不可以赋值改变）；可变数据：List、set、dictionary（获取到元素，可以改变）
# 03. 写法： string = 'abc', tuple = ('abc', 123) , List = ['123', 123] , set() or parames = {'value'} ,dictionary = { 'name':'abcd', 'code' :'200'} 




